package com.nuoniu.sibanyun.service.crm;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nuoniu.sibanyun.common.result.HttpResult;
import com.nuoniu.sibanyun.entity.crm.CrmCustomer;
import com.nuoniu.sibanyun.entity.crm.dto.SimpleCrmCustomerDto;
import com.nuoniu.sibanyun.entity.dto.*;
import com.nuoniu.sibanyun.entity.vo.CrmCustomerFinanceVo;
import com.nuoniu.sibanyun.entity.vo.SelectVo;
import com.nuoniu.sibanyun.entity.vo.SimpleCrmCustomerVo;
import com.nuoniu.sibanyun.userThread.UserInfo;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;

/**
 * <p>
 * 客户基本信息 服务类
 * </p>
 *
 * @author baiqiang
 * @since 2020-06-15
 */
public interface ICrmCustomerService extends IService<CrmCustomer> {

    /**
     * 动态查询
     * @return
     */
    Page<HashMap<String,Object>> CrmDynamicPage(DynamicDto dynamicDto);

    /**
     * 获取 客户信息
     * @param name
     * @return
     */
    CrmCustomer getByName(String name);

    String checkCrmName(List<DynamicConditionDto> dtos);

    Page<SelectVo> pageForSelect(Page page,CrmCustomerSearchDto crmCustomerSearchDto);

    /**
     * 获取客户信息
     * @param page
     * @param crmCustomerSearchDto
     * @return
     */
    Page<SimpleCrmCustomerVo> pageForVoucher(Page page, CrmCustomerSearchDto crmCustomerSearchDto);

    /**
     * 根据id查询，验证用户权限
     * @param id
     * @return
     */
    CrmCustomer findById(Integer id);

    /**
     * 获取客户状态
     * @param id
     * @return
     */
    Integer getCrmCustomerStatus(Integer id);

    /**
     * 获取Excel表头
     * @author 小啊刚
     * @date 2020/6/19
     */
    List<String> getExcelFiled(MultipartFile file);

    /**
     * 获取Excel表头
     * @param file
     * @param companyType 客户：isCustomer，供应商：isSupplier,其它：isOther
     * @return
     */
    HashMap<String,Object> getExcelFiledFromCompanyType(MultipartFile file,String companyType);
    /**
     * 根据名称获取客户
     * @author 小啊刚
     * @date 2020/6/19
     */
    CrmCustomer findByName(Integer companyId, String crmName);

    /**
     * 获取客户编码
     * @author 小啊刚
     * @date 2020/6/19
     */
    String getCustomerNo(Integer companyId);

    /**
     * 修改状态
     * @author 小啊刚
     * @date 2020/6/19
     */
    void updateStatus(String id, Integer status);

    /**
     * 导出数据
     * @author 小啊刚
     * @date 2020/6/19
     */
    void exportData(DynamicDto dynamicDto, HttpServletResponse response);

    /**
     * 客户领用
     * @author 小啊刚
     * @date 2020/6/20
     */
    String receive(String remarks, List<Integer> ids);

    /**
     * 批量 共享客户
     * @param crmCustomer
     * @param ids
     */
    void saveShare(CrmCustomer crmCustomer, Long... ids);

    /**
     * 释放客户
     * @author 小啊刚
     * @date 2020/6/20
     */
    void release(List<Integer> ids);

    /**
     * 批量校验是否不是当前用户的 客户资源
     * @param ids
     * @return
     */
    boolean checkCustomerCollarUser(Collection<?> ids);

    boolean checkCustomerType(Collection<?> ids,Integer crmType);

    /**
     * 成交客户
     * @author 小啊刚
     * @date 2020/6/20
     */
    void dealSave(List<Integer> ids);

    /**
     * 成交客户 退回
     * @param ids
     */
    void potentialSave(List<Integer> ids);

    /**
     * 分配客户
     * @author 小啊刚
     * @date 2020/6/20
     */
    void distributionSave(Integer type, Integer collarUserId, String collarUserName, String ids);

    /**
     * 客户合并
     * @author 小啊刚
     * @date 2020/6/22
     */
    void combineSave(String ids, Integer id);

    /**
     * 批量查询 客户
     * @param crmNames
     * @return
     */
    List<CrmCustomer> listSimpleCrmCustomerDto(Collection<String> crmNames);

    /**
     * 导入"客户"数据
     * isFinance 是否财务使用
     * @author 小啊刚
     * @date 2020/6/22
     */
    Map importData(MultipartFile file, boolean b, String[] excelFiled, String[] dbFiled,String companyType,Boolean isTask,Long taskId) throws IOException;


    /**
     * 导入"供应商"数据
     */
    Map importVendorData(MultipartFile file, boolean b, String[] excelFiled, String[] dbFiled) throws IOException;
    /**
     * 获取客户和联系人字段
     * @author 小啊刚
     * @date 2020/6/30
     */
    List<Map<String, String>> getCrmImportFiled();

    /**
     * 修改客户编码
     * @author 小啊刚
     * @date 2020/7/6
     */
    void updateCrmCode(String currentCode);

    /**
     * 修改客户操作人
     * @author 小啊刚
     * @date 2020-08-05
     */
    void updateUserRealName(Long id, String realName);

    /**
     * 客户跟进分析统计
     * @author 小啊刚
     * @date 2020-08-06
     */
    Page<Map> followAnalysis(Page page, CrmFollowAnalysis analysis);

    /**
     * 客户分析table数据
     * @author 小啊刚
     * @date 2020-08-08
     */
    Map crmAnalysisTable(CrmFollowAnalysis analysis);



    /**
     * 分页查询 财务 不可以使用的客户
     * @param page
     * @param crmCustomerFinanceDto
     * @return
     */
    Page<CrmCustomerFinanceVo> pageCrmCustomerFinanceVo(Page page,  CrmCustomerFinanceDto crmCustomerFinanceDto);


    /**
     *  保存 财务使用的 客户_财务 信息
     * @param crmCustomerFinanceVo
     */
    void saveFromFinance(CrmCustomerFinanceVo crmCustomerFinanceVo);

    /**
     * 校验 是否是财务使用的客户，如果不是就转换成财务使用的
     * @param id
     */
    void checkForFinance(Integer id);
    /**
     * 从 财务使用 里面移除（更改 is_finance 为0,适用于供应链--》客户档案，移除后 会出现在“客户管理”模块）
     * @param ids)
     */
    void removeFromFinance(Long... ids);


    /**
     * 保存客户
     * @author 小啊刚
     * @date 2021-04-03
     */
    Long saveCustomer(CrmCustomerDto crmCustomerDto);



    /**
     * 下载客户导入模版
     * @author 小啊刚
     * @date 2021-06-12
     */
    void importTemplate(HttpServletResponse response,String source);



//    /**
//     * erp客户：下载导入模版
//     */
//    void downloadImportTemplate(HttpServletResponse response);
//
//    /**
//     * erp客户：固定字段导入( 客户档案 导入 )
//     */
//    Map erpCrmImportData(MultipartFile file) throws IOException, NoSuchFieldException, IllegalAccessException;
//    /**
//     * erp客户：导出erp客户数据
//     * @author 小啊刚
//     * @date 2021-06-12
//     */
//    void downloadErpCrmData(HttpServletResponse response);

    /**
     * 检查客户名称
     * @author 小啊刚
     * @date 2021-09-22
     */
    CrmCustomer checkName(String crmName, Integer companyId);

    /**
     * 更新 客户外呼状态
     * @param crmIds
     * @param taskId
     * @param isTasking
     */
    void updateCallTaskState(UserInfo userInfo,Set<Long> crmIds, Integer taskId, boolean isTasking);

    /**
     * 更新 客户外呼状态(指定任务)
     * @param taskIds
     */
    void updateCallTaskStateByCloseTask(UserInfo userInfo,List<Long> taskIds);




    /*******************  供应商管理 **************************/
    /**
     * 保存 供应商
     * @param crmCustomerDto
     */
    void saveVendor(CrmCustomerDto crmCustomerDto);


    /**
     * 批量 移除 供应商 属性
     * @param ids
     */
    void removeVendor(String ids);




    /*******************  通用类 **************************/
    /**
     * 根据ID 获取当前租户的客户( 不校验权限 )
     * @param id
     * @return
     */
    CrmCustomer getById(Long id,Integer companyId);


    /**
     * 客户联系提醒通知
     * @author 小啊刚
     * @date 2022-01-12
     */
    void contactCustomerNotice();
}
